精通Linux系列八:文件属性
点击关注公众号,AI&编程干货及时送达
文件属性
命令 | 含义 |
stat | 显示文件和目录的属性。 |
wc | 计算文件的字节、单词和行数。 |
du | 测量文件和目录的磁盘使用情况。 |
file | 识别(猜测)文件的类型。 |
touch | 更改文件和目录的时间戳。 |
chown | 更改文件和目录的所有者。 |
chgrp | 更改文件和目录的群组所有权。 |
chmod | 更改文件和目录的保护模式。 |
umask | 为新文件和目录设置默认模式。 |
chattr | 更改文件和目录的扩展属性。 |
lsattr | 列出文件和目录的扩展属性。 |
当检查一个Linux文件时,要记住,内容只是一半。每个文件和目录也有描述其所有者,大小,访问权限和其他信息的属性。ls -l
命令(参见[“基本文件操作”])显示了其中的一些属性,但其他命令提供了更多的信息。
stat
stdin stdout - file -- opt --help --version
stat [选项] 文件
stat
命令列出文件(默认)或文件系统(-f
选项)的重要属性。文件信息如下:
→ stat myfile
文件: ‘myfile’
大小: 1168 块: 8
IO 块: 4096 常规文件
设备: 811h/2065d Inode: 37224455 链接: 1
访问: (0644/-rw-r--r--) 用户ID: ( 600/lisa)
组ID: ( 620/users)
访问: 2015-11-07 11:15:14.766013415 -0500
修改: 2015-11-07 11:15:14.722012802 -0500
改变: 2015-11-07 11:15:14.722012802 -0500
生日: -
这里包括文件名,以字节为单位的大小(1168),以块为单位的大小(8),文件类型(常规文件),八进制的权限(0644),“ls -l”格式的权限(-rw-r--r--),所有者的用户ID(600),所有者的名称(lisa),所有者的组ID(620),所有者的组名(users),设备类型(16进制的811,10进制的2065),inode编号(37224455),硬链接的数量(1),以及文件的最近访问、修改和状态更改的时间戳。文件系统信息如下:
→ stat -f myfile
文件: "myfile"
ID: f02ed2bb86590cc6 Namelen: 255
类型: ext2/ext3
块大小: 4096 基本块大小: 4096
块: 总数: 185788077 空闲: 108262724
可用: 98819461
Inodes: 总数: 47202304 空闲: 46442864
这里包括文件名(myfile),文件系统ID(f02ed2bb86590cc6),该文件系统允许的文件名的最大长度(255字节),文件系统类型(ext),文件系统的块大小(4096),文件系统中的总块数、空闲块数和可用块数(分别为185788077,108262724和98819461),以及总的和空闲的inodes(分别为47202304和46442864)。
-t
选项以单行的形式,无标题地呈现同样的数据。这对shell脚本或其他程序的处理很方便:
→ stat -t myfile
myfile 1168 8 81a4 600 620 811 37224455 1 0 0
1446912914 1446912914 1446912914 0 4096
→ stat -tf myfile
myfile f02ed2bb86590cc6 255 ef53 4096 4096
185788077 108262715 98819452 47202304 46442864
有用的选项
-L | 跟踪符号链接并报告它们指向的文件。 |
-f | 报告包含文件的文件系统,而不是文件本身。 |
-t | 简洁模式:在单行打印信息。 |
wc
stdin stdout - file -- opt --help --version
wc [选项] [文件]
wc
(词计数)程序打印(可能是)文本文件中的字节、单词和行数的计数:
→ wc myfile
18 211 1168 myfile
这个文件有18行,211个由空格分隔的单词,以及1168字节。
有用的选项
-l | 仅打印行数。 |
-w | 仅打印单词数。 |
-c | 仅打印字节数。 |
-L | 找到每个文件中最长的行,并打印其字节长度。 |
du
stdin stdout - file -- opt --help --version
du [选项] [文件| 目录]
du
(磁盘使用情况)命令测量文件或目录占用的磁盘空间。默认情况下,它测量当前目录及其所有子目录,为每个目录打印总块数,并在底部打印总计:
→ du
36 ./Mail
340 ./Files/mine
40 ./Files/bob
416 ./Files
216 ./PC
2404 .
它也可以测量文件的大小:
→ du myfile emptyfile hugefile
4 myfile
0 emptyfile
18144 hugefile
有用的选项
-b | 以字节为单位测量使用情况。 |
-k | 以千字节为单位测量使用情况。 |
-m | 以兆字节为单位测量使用情况。 |
-B N | 以你定义的块显示大小,其中1块 = N 字节。(默认值 = 1024) |
-h -H | 以人类可读的单位打印。例如,如果两个目录的大小分别为1G和25K,du -h 将打印1G和25K。-h 选项使用1024的幂,而-H 使用1000的幂。 |
-c | 在最后一行打印总数。当测量目录时,这是默认行为,但在测量单个文件时,如果你想要一个总数,就需要提供-c 。 |
-L | 跟踪符号链接,并测量它们指向的文件。 |
-s | 仅打印总大小。 |
file
stdin stdout - file* -- opt --help --version
file [选项] 文件
file
命令报告文件的类型。输出是根据文件内容和其他因素做出的猜测:
→ file /etc/hosts /usr/bin/who letter.docx
/etc/hosts: ASCII 文本
/usr/bin/who: ELF 64位 LSB 可执行程序...
letter.docx: Microsoft Word 2007+(微软 Word 2007+)
有用的选项
-b | 省略文件名(输出的左列)。 |
-i | 为文件打印 MIME 类型,如“text/plain”或“audio/mpeg”,而不是通常的输出。 |
-f name_file | 从给定的 name_file 中读取文件名,每行一个,并报告它们的类型。之后,像往常一样处理命令行上的文件名。 |
-L | 跟踪符号链接,报告目标文件的类型而不是链接。 |
-z | 如果文件被压缩(参见[“文件压缩和打包”]),则查看未压缩的内容以确定文件类型,而不是报告“压缩数据”。 |
touch
stdin stdout - file* -- opt --help --version
touch [选项] 文件
touch
命令更改与文件关联的两个时间戳:它的修改时间(文件数据最后更改的时间)和它的访问时间(文件最后读取的时间)。要将这两个时间戳设置为现在,运行:
→ touch myfile
你可以将这些时间戳设置为任意值,例如:
→ touch -d "1975年11月18日" myfile
如果给定的文件不存在,touch
会创建它,提供了一种方便的方式来创建空文件。
有用的选项
-a | 仅更改访问时间。 |
-m | 仅更改修改时间。 |
-c | 如果文件不存在,不创建它(通常,touch 会创建它)。 |
-d timestamp | 设置文件的时间戳(timestamp )。可以接受大量的时间戳格式,从“12/28/2001 3pm”到“28-May”(默认为当前年份,时间为午夜)到“next tuesday 13:59”到“0”(今天的午夜)。可以试验并用stat 检查你的工作。完整的文档可以从info touch 获取。 |
chown
stdin stdout - file -- opt --help --version
chown [options] user_spec files
chown
(变更所有者)命令设置文件和目录的所有权。若要使用户“smith”成为几个文件和一个目录的所有者,运行:
→ sudo chown smith myfile myfile2 mydir
user_spec
参数可能是以下几种可能性:
• 一个存在的用户名(或任何数字用户ID),用来设置所有者:
chown smith myfile
• 一个存在的用户名(或任何数字用户ID),可选地后跟一个冒号和一个存在的组名(或任何数字组ID),用来设置所有者和组:
chown smith:users myfile
• 一个存在的用户名(或任何数字用户ID)后跟一个冒号,用来设置所有者并将组设置为调用用户的登录组:
chown smith: myfile
• 一个存在的组名(或任何数字组ID)前跟一个冒号,只设置组:
chown :users myfile
•
--reference=
*file
*用来设置与另一个给定文件相同的所有者和组
有用的选项
--dereference | 跟踪符号链接并操作它们指向的文件。 |
-R | 在目录层次结构中递归地改变权限。 |
chgrp
stdin stdout - file -- opt --help --version
chgrp [options] group_spec files
chgrp
(变更组)命令设置文件和目录的组所有权:
→ chgrp smith myfile myfile2 mydir
group_spec
参数可能是以下几种可能性:
• 组名或数字组ID
•
--reference=
*file
*,设置与另一个给定文件相同的组所有权
请参阅[“组管理”]以获取有关组的更多信息。
有用的选项
--dereference | 跟踪符号链接并操作它们指向的文件。 |
-R | 在目录层次结构中递归地改变所有权。 |
chmod
stdin stdout - file -- opt --help --version
chmod [options] permissions files
chmod
(改变模式)命令通过设置访问权限,保护文件和目录不被同一系统上的未经授权的用户访问。典型的权限是读取、写入和执行,它们可以限制给文件所有者、文件的组所有者和/或其他用户。权限参数可以采取三种不同的形式:
•
--reference=
*file
*,设置与另一个给定文件相同的权限。• 一个最多四位数的八进制数,指定文件的绝对权限位,如[图6]。最左边的数字是特殊的(后面会描述),第二、第三和第四分别代表文件的所有者、文件的组和所有用户。
• 一个或多个指定绝对或相对权限的字符串(即,相对于文件现有的权限)。例如,
a+r
使文件可以被所有用户读取。
最常见的权限是:
→ chmod 600 myfile 仅供你私人使用的文件
→ chmod 644 myfile 每个人都可以读取;你可以写入
→ chmod 700 mydir 仅供你私人使用的目录
→ chmod 755 mydir 每个人都可以读取;你可以写入
图6. 文件权限位解释
在第三种形式中,每个字符串由三部分组成:
• 范围 (可选)
u
代表用户,g
代表组,o
代表不在组中的其他用户,a
代表所有用户。默认是a
。• 命令
+
用于添加权限;−
用于删除权限;或=
用于设置绝对权限,忽略现有的权限。• 权限
r
代表读取,w
代表写入/修改,x
代表执行(对于目录,这是允许cd
进入目录的权限),X
代表条件执行(稍后解释),u
代表复制用户权限,g
代表复制组权限,o
代表复制“其他用户”的权限,s
代表设置用户ID或组ID,t
代表粘性位。
例如,ug+rw
会为用户和组添加读写权限,a-x
(或者只用 -x
)会移除所有人的执行权限,o=r
会直接把“其他用户”的权限设置为只读。你可以用逗号隔开这些字符串来组合它们,比如 ug+rw,a-x
。
条件执行权限(X
)的含义与 x
相同,除非文件已经是可执行的,或者文件是一个目录,否则它不会起作用。
设置用户ID和设置组ID,当应用于可执行文件(程序和脚本)时,会产生强大的效果。假设我们有一个可执行文件 F,由用户“smith”和组“friends”拥有。如果文件 F 启用了设置用户ID,那么任何运行 F 的人都会“变成”用户“smith”,拥有她所有的权利和特权,直到程序结束。同样,如果 F 启用了设置组ID,任何执行 F 的人在程序运行期间都会成为“friends”组的成员。你可以想象,设置用户ID和设置组ID可能会影响系统的安全,所以除非你真正知道自己在做什么,否则不要使用它们。一个不小心的 chmod +s
可能会使你的整个系统面临攻击。
粘性位,最常用于 /tmp 目录,控制该目录中文件的移除。通常,如果你在一个目录中有写权限,你可以删除或移动它内部的文件,即使你没有这些文件本身的访问权限。在设置了粘性位的目录内,你需要对文件有写权限才能删除或移动它。
有用的选项
-R | 在目录层级中递归地改变所有权。 |
umask
stdin stdout - file -- opt --help --version
umask [选项] [掩码]
umask
命令设置或显示你创建文件和目录的默认模式 - 是否可由你自己、你的组和全世界进行读取、写入和/或执行:
→ umask
0002
→ umask -S
u=rwx,g=rwx,o=rx
首先让我们进行一些技术性的讨论,然后给出一些常识性的建议。umask是一个二进制(基数为2)值,尽管它通常以八进制(基数为8)的形式呈现。它通过使用二进制操作 NOT AND
与文件的八进制值0666和目录的八进制值0777组合来定义你的默认保护模式。例如,umask 0002产生了一个默认的文件模式0664:
0666 NOT AND 0002
= 000110110110 NOT AND 000000000010
= 000110110110 AND 111111111101
= 000110110100
= 0664
类似地,对于目录,0002
NOT AND
0777
产生一个默认模式0775。
如果这个解释看起来像是来自外太空,这里有一些简单的配方。使用掩码0022给自己全部权限,给其他人只给读/执行权限:
→ umask 0022
→ touch newfile && mkdir dir
→ ls -ldG newfile dir
-rw-r--r-- 1 smith 0 Nov 11 12:25 newfile
drwxr-xr-x 2 smith 4096 Nov 11 12:25 dir
使用掩码0002给自己和你的默认组全部权限,并给其他人读/执行权限:
→ umask 0002
→ touch newfile && mkdir dir
→ ls -ldG newfile dir
-rw-rw-r-- 1 smith 0 Nov 11 12:26 newfiledrwxrwxr-x 2 smith 4096 Nov 11 12:26 dir
使用掩码0077以给自己全部权限,其他人无任何权限:
→ umask 0077
→ touch newfile && mkdir dir
→ ls -ldG newfile dir
-rw----- 1 smith 0 Nov 11 12:27 newfile
drwx---- 2 smith 4096 Nov 11 12:27 dir
chattr
stdin stdout - file -- opt --help --version
chattr [options] [+ − =]attributes [files]
如果你曾使用过其他Unix系统,你可能会对Linux文件可以具有超出访问权限的额外属性感到惊讶。如果文件位于"ext"文件系统(ext2、ext3等),你可以使用chattr
(更改属性)命令设置这些扩展属性,并使用lsattr
列出它们。
像chmod
一样,属性可以相对地添加(+)或移除(-),或绝对地设置(=)。例如,要保持文件被压缩和不可转储,运行:
→ chattr +cd myfile
属性( Attribute ) | 含义( Meaning ) |
a | 仅添加:只允许向此文件追加内容,但不能以其他方式编辑。仅root用户可以。 |
A | 不标记访问:访问此文件不会更新其访问时间戳(atime)。 |
c | 压缩:写入时数据透明压缩,读取时解压。 |
d | 不转储:告诉dump 程序在备份时忽略此文件(参见["备份和远程存储"])。 |
i | 不可变:文件不能被更改或删除(仅root)。 |
j | 记录数据(仅限ext3文件系统)。 |
s | 安全删除:如果删除,此文件的数据将被零覆盖。 |
S | 同步更新:更改立即写入磁盘。 |
u | 不可删除:文件无法被删除。 |
还有一些其他属性,其中一些是模糊的或实验性的。详情请查看manpage。
有用的选项
-R | 递归处理目录。 |
lsattr
stdin stdout - file -- opt --help --version
lsattr [options] [files]
如果你使用chattr
设置了扩展属性,你可以使用lsattr
(列出属性)查看它们。输出使用与chattr
相同的字母;例如,此文件是不可变的和不可删除的:
→ lsattr myfile
-u--i``` myfile
如果没有指定文件,lsattr
将打印当前目录中所有文件的属性。
有用的选项
-R | 递归处理目录。 |
-a | 列出所有文件,包括那些名字以点开始的文件。 |
-d | 如果列出的是一个目录,不列出其内容,只列出目录本身。 |
推荐阅读
你好,我是拾叁,7年开发老司机、互联网两年外企5年。怼得过阿三老美,也被PR comments搞崩溃过。这些年我打过工,创过业,接过私活,也混过upwork。赚过钱也亏过钱。一路过来,给我最深的感受就是不管学什么,一定要不断学习。只要你能坚持下来,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯和编程知识,帮你积累弯道超车的资本。